package com.gopay.bis.service.bank.impl.wap;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.annotation.Resource;

import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.BeanUtils;

import com.gopay.bis.common.util.BankLogUtils;
import com.gopay.bis.common.util.BisPayCheckUtils;
import com.gopay.bis.common.util.constants.BisPayConstants;
import com.gopay.bis.manager.bank.Wap.BocWapB2cManager;
import com.gopay.common.Result;
import com.gopay.common.constants.bank.BocConstants;
import com.gopay.common.constants.proccode.ProcCodeConstants;
import com.gopay.common.domain.bank.BaseMessage;
import com.gopay.common.domain.bank.boc.ebank.BocB2cMessage;
import com.gopay.common.exception.GopayException;
import com.gopay.remote.bank.WapPayInteractRemoteService;

/**
 * 中国银行 WAP支付B2C业务实现
 * @BocWapPayB2cBankServiceImpl.java
 * @author xiaojian
 *
 */
public class BocWapPayB2CBankServiceImpl implements WapPayInteractRemoteService {

	@Resource(name = "bocWapB2cManager")
	private BocWapB2cManager bocWapB2cManager;
	@Override
	public Result pay(BaseMessage base) {
		Result result = new Result(false);
		try {
			BocB2cMessage messageB2C = new BocB2cMessage();
			BeanUtils.copyProperties(base, messageB2C);
			base.setBankOrderId(base.getOrderId());
			messageB2C = (BocB2cMessage) bocWapB2cManager.sign(messageB2C);
			result.setDefaultModel(messageB2C);
			result.setSuccess(true);
		} catch (GopayException e) {
			BankLogUtils.printServiceImplExceptionLog(e);
			result.setResultCode(e.getErrCode());
		} catch (Exception ex) {
			BankLogUtils.printServiceImplExceptionLog(ex);
			result.setResultCode(ProcCodeConstants.PROC_CODE_100E6029);
		}
		return result;
	}

	/**
	 * 银行返回消息
	 * @param BaseMessage
	 * @return result
	 */
	public Result bankBack(BaseMessage base) {
		Result result = new Result(false);
		try {
			BocB2cMessage messageB2C = new BocB2cMessage();
			BeanUtils.copyProperties(base, messageB2C);
			boolean flag = (Boolean) bocWapB2cManager.verify(messageB2C);
			result.setDefaultModel(flag);
			result.setSuccess(true);			
        	Map<String, String> param = new HashMap<String, String>();
        	// 验签成功入账
			if (BocConstants.B2C_ORDER_STATUS_PAY.equals(messageB2C.getOrderStatus())) {					
				param.put("orderId", messageB2C.getOrderId());
				param.put("amt", messageB2C.getPayAmount());
				param.put("cardType", "Unknown");
				param.put("notifyNum", "1");
				param.put("payStatus", "00");
				param.put("retCode", "00");
				param.put("retMsg", "验签成功");
				param.put("signData", messageB2C.getSignMessage());
				param.put("isFront", String.valueOf(base.isFront()));
				result.setModel("isNotifyCashier", param);
				result.setOrderStatus(true);
			} 
			else{
				// 通知后台地址该订单失败
				param.put("orderId", messageB2C.getOrderId());
				param.put("amt", messageB2C.getPayAmount());
				param.put("cardType", "Unknown");
				param.put("notifyNum", "1");
				param.put("payStatus", "01");
				param.put("retCode", "01");
				param.put("retMsg", "验签失败");
				param.put("signData", messageB2C.getSignMessage());
				param.put("isFront", String.valueOf(base.isFront()));
				result.setModel("isNotifyCashier", param);
				result.setOrderStatus(false);
			}				 
		} catch (GopayException e) {
			BankLogUtils.printServiceImplExceptionLog(e);
			result.setResultCode(e.getErrCode());
		}
		return result;
	}

	@Override
	public Result queryBack(BaseMessage base) {

		return null;
	}

	/**
	 * 银行查询请求
	 * @param BaseMessage
	 * @return result
	 */
	public Result query(BaseMessage base) {
		Result result = new Result(false);
		try {
			BocB2cMessage messageB2c = new BocB2cMessage();
			BeanUtils.copyProperties(base, messageB2c);
		    BocB2cMessage  b2cmessage = (BocB2cMessage)bocWapB2cManager.query(messageB2c);
			result.setDefaultModel(b2cmessage);
			result.setSuccess(true);
			if(BisPayCheckUtils.checkExternalOrderID(messageB2c.getOrderId())){
				Map<String,String> param = new HashMap<String,String>();
				param.put("orderId", messageB2c.getOrderId());
				param.put("amount",messageB2c.getPayAmount());
				if(b2cmessage == null){
					// 指明订单为空
					param.put("returnCode", BisPayConstants.QUERYSTATE_FAIL);
					param.put("returnMessage", "银行返回对账结果为空");
					param.put("tradeState", BisPayConstants.TRADESTATE_OTHER);
					result.setModel("queryResult", param);
					return result;
				}else if(StringUtils.isNotBlank(b2cmessage.getException())){
					// 指明订单错误
					param.put("returnCode", BisPayConstants.QUERYSTATE_FAIL);
					param.put("returnMessage", b2cmessage.getException());
					param.put("tradeState", BisPayConstants.TRADESTATE_OTHER);
					result.setModel("queryResult", param);
					return result;
				}else{
					List<BocB2cMessage> bocB2cMessage = b2cmessage.getList();
					if(bocB2cMessage != null && bocB2cMessage.size() > 0){
						param.put("returnCode", BisPayConstants.QUERYSTATE_SUCCESS);
						BocB2cMessage orderRes = b2cmessage.getList().get(0);
						if(StringUtils.equals(BocConstants.B2C_ORDER_STATUS_FAIL,orderRes.getOrderStatus())){
							param.put("tradeState", BisPayConstants.TRADESTATE_FAIL);
							param.put("returnMessage","交易失败");
						}
						// 订单处理成功
						else if(StringUtils.equals(BocConstants.B2C_ORDER_STATUS_PAY, orderRes.getOrderStatus())){
							param.put("tradeStatue", BisPayConstants.TRADESTATE_SUCCESS);
							param.put("returnMessage", "交 易 成功");	
						}
						// 以下情况不处理
						else if(StringUtils.equals(BocConstants.B2C_ORDER_STATUS_UNDEAL,orderRes.getOrderStatus())){
							param.put("tradeStatue", BisPayConstants.TRADESTATE_OTHER);
							param.put("returnMessage", "交易没有处理");
						}else if(StringUtils.equals(BocConstants.B2C_ORDER_STATUS_CANCEL, orderRes.getOrderStatus())){
							param.put("tradeStatue", BisPayConstants.TRADESTATE_OTHER);
							param.put("returnMessage", "交易被撤销");
						}else if(StringUtils.equals(BocConstants.B2C_ORDER_STATUS_RETURN_GOODS, orderRes.getOrderStatus())){
							param.put("tradeStatue", BisPayConstants.TRADESTATE_OTHER);
							param.put("returnMessage", "交易退货");
						}else if(StringUtils.equals(BocConstants.B2C_ORDER_STATUS_UNKNOW, orderRes.getOrderStatus())){
							param.put("tradeStatue", BisPayConstants.TRADESTATE_OTHER);
							param.put("returnMessage", "交易发生未知情况");
						}else {
							param.put("tradeStatue", BisPayConstants.TRADESTATE_OTHER);
							param.put("returnMessage", "交易发生异常");
						}
					}
				}
				result.setModel("queryResult", param);
			}
		} catch (GopayException e) {
			BankLogUtils.printServiceImplExceptionLog(e);
			result.setResultCode(e.getErrCode());
		} catch (Exception ex) {
			BankLogUtils.printServiceImplExceptionLog(ex);
			result.setResultCode(ProcCodeConstants.PROC_CODE_100E6033);
		}
		return result;
	}


	/**
	 * 日终结算
	 * @param BaseMessage
	 * @return result
	 */
	public Result dayend(BaseMessage base) {
		return null;
	}
	
	
	public Result refund(BaseMessage base) {	
		return null;
	}

}
